import { createHash } from "crypto";

interface IProfile {
    get authPlayerName() : string;
    get UUID() : string;
    get accessToken() : string;
    get userType() : string;
}

/**  
 * 生成离线玩家的 UUID。  
 * 这个函数是由文心一言由(https://gist.github.com/games647/2b6a00a8fc21fd3b88375f03c9e2e603)转换来的。
 *  
 * @param username 用户名。  
 * @returns 生成的 UUID 字符串。  
 */  
function constructOfflinePlayerUuid(username: string): string {  
    // 提取自 Java 代码：  
    // new GameProfile(UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(Charsets.UTF_8)), name));  
    const data = Buffer.from(`OfflinePlayer:${username}`, 'utf8');  
    const md5Hash = createHash('md5').update(data).digest('hex');  
    const binaryData = Buffer.from(md5Hash, 'hex');  
  
    // 设置版本号为 3 -> 基于名称的 MD5 哈希  
    binaryData[6] = (binaryData[6] & 0x0f) | 0x30;  
  
    // IETF 变体  
    binaryData[8] = (binaryData[8] & 0x3f) | 0x80;  
  
    return createJavaUuid(binaryData.toString('hex'));  
}  
  
/**  
 * 将长十六进制字符串转换为一个标准的 UUID 格式字符串。  
 *  
 * @param stripped 去除连字符的 UUID 十六进制字符串。  
 * @returns 格式化的 UUID 字符串。  
 */  
function createJavaUuid(stripped: string): string {  
    // 示例: 069a79f4-44e9-4726-a5be-fca90e38aaf5  
    const components = [  
        stripped.slice(0, 8),  
        stripped.slice(8, 12),  
        stripped.slice(12, 16),  
        stripped.slice(16, 20),  
        stripped.slice(20)  
    ];  
  
    return components.join('-');  
}

class OfflineProfile implements IProfile {
    private name;
    private uuid;

    constructor(name:string) {
        this.name = name;
        this.uuid = constructOfflinePlayerUuid(name);
    }

    get authPlayerName(): string {
        return this.name;
    }

    get UUID(): string {
        return this.uuid;
    }

    get accessToken(): string {
        return "xd";
    }

    get userType(): string {
        return "Legacy"
    }

    
}

export {
    IProfile,
    OfflineProfile
}